package com.cssw.fyzb.core.mao.video;

import com.cssw.fyzb.core.model.mos.VideoStatMo;
import com.cssw.fyzb.core.mongo.MongoClient;
import com.cssw.fyzb.core.util.DocUtil;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author Feng Chen
 */
@Component
public class VideoStatMaoImpl implements VideoStatMao {

    @Autowired
    private MongoClient mongoClient;

    @Override
    public VideoStatMo findByVideoId(Long videoId) {
        Document doc = mongoClient.getCollection("video_stat")
                .find(new Document("videoId", videoId))
                .first();
        return DocUtil.decoce(doc, VideoStatMo.class);
    }

    @Override
    public void save(VideoStatMo videoStatMo) {
        mongoClient.getCollection("video_stat")
                .insertOne(DocUtil.encode(videoStatMo));
    }

    @Override
    public void incLikes(Long videoId) {
        incLikes(videoId, 1);
    }

    @Override
    public void incLikes(Long videoId, Integer num) {
        // 不存在先创建
        createIfNull(videoId);

        // 加 一 操作
        mongoClient.getCollection("video_stat").updateOne(
                new Document("videoId", videoId),
                new Document("$inc", new Document("likes", num))
        );
    }

    @Override
    public void decLikes(Long videoId) {
        // 不存在先创建
        VideoStatMo videoStatMo = createIfNull(videoId);
        if (videoStatMo.getLikes() <= 0){
            return;
        }

        // 加 一 操作
        mongoClient.getCollection("video_stat").updateOne(
                new Document("videoId", videoId),
                new Document("$inc", new Document("likes", -1))
        );
    }

    @Override
    public void incViews(Long videoId) {
        incViews(videoId, 1);
    }

    @Override
    public void incViews(Long videoId, Integer num) {
        // 不存在先创建
        createIfNull(videoId);

        // 加 一 操作
        mongoClient.getCollection("video_stat").updateOne(
                new Document("videoId", videoId),
                new Document("$inc", new Document("views", num))
        );
    }

    @Override
    public void incComments(Long videoId) {
        // 不存在先创建
        createIfNull(videoId);

        // 加 一 操作
        mongoClient.getCollection("video_stat").updateOne(
                new Document("videoId", videoId),
                new Document("$inc", new Document("comments", 1))
        );
    }

    @Override
    public void incShares(Long videoId) {
        // 不存在先创建
        createIfNull(videoId);

        // 加 一 操作
        mongoClient.getCollection("video_stat").updateOne(
                new Document("videoId", videoId),
                new Document("$inc", new Document("shares", 1))
        );
    }

    // SECTION : INNER HELPER
    private VideoStatMo createIfNull(Long videoId) {
        VideoStatMo stat = findByVideoId(videoId);
        if (stat == null) {
            stat = new VideoStatMo();
            stat.setVideoId(videoId);
            save(stat);
        }
        return stat;
    }


}
